package br.com.agileplus.linkedcompany.web.api.endpoints;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

import br.com.agileplus.linkedcompany.domain.Usuario;
import br.com.agileplus.linkedcompany.service.exception.AutenticacaoException;
import br.com.agileplus.linkedcompany.service.impl.UsuarioServiceImpl;
import br.com.agileplus.linkedcompany.web.api.dto.in.UsuarioDTO;
import br.com.agileplus.linkedcompany.web.api.dto.out.AutenticacaoUsuarioDTO;
import br.com.agileplus.linkedcompany.web.api.mapper.UsuarioDtoMapper;

@Component
@Path("/usuario")
public class UsuarioServiceAPI {
	
	private UsuarioServiceImpl usuarioServiceImpl;

	public UsuarioServiceAPI() {
		ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("classpath:applicationContext-linkedcompany-service.xml");
		
		this.usuarioServiceImpl = (UsuarioServiceImpl) applicationContext.getBean("usuarioServiceImpl");
	}
	
	@GET
    @Path("/{idUsuario}")
	@Produces(MediaType.APPLICATION_JSON)
    public UsuarioDTO getUsuarioById(@PathParam("idUsuario") Long idUsuario) {
		Usuario usuario = this.usuarioServiceImpl.getUsuarioById(idUsuario);
        return UsuarioDtoMapper.from(usuario);
	}
	
	@POST
	@Consumes(MediaType.APPLICATION_XML)  
	@Path("/autenticar") 
	@Produces(MediaType.APPLICATION_XML)
	public Response autenticarUsuario(AutenticacaoUsuarioDTO autenticacaoUsuarioDto) {

		Usuario usuario = null;
		UsuarioDTO retorno = new UsuarioDTO();
		try {
			usuario = this.usuarioServiceImpl.verificarAutenticacaoUsuario(autenticacaoUsuarioDto.getUsuario(), autenticacaoUsuarioDto.getSenha());
		} catch (AutenticacaoException e) {
			
			retorno.setAutenticado(false);
			retorno.getErros().add(e.getMsg());
			
			return Response.status(Response.Status.OK).  
	                entity(retorno).  
	                type(MediaType.APPLICATION_XML).  
	                build();
		}
		
		retorno = UsuarioDtoMapper.from(usuario);
		
		Response response = Response.status(Response.Status.OK).  
                entity(retorno).  
                type(MediaType.APPLICATION_XML).  
                build();
		
		return response;  
	}

}
